#ifndef VSqlMetaMap_H
#define VSqlMetaMap_H

#include "VSqlMeta.h"

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

class VSqlMetaMap
{
public:
	VSqlMetaMap(const QSqlDatabase &db);
	~VSqlMetaMap();

	QSqlDatabase db() const { return m_nodeMap.db();}
	VSqlMetaColumnList columnList() const { return m_columnList;}

	VSqlMeta folderRoot() { return meta_byKeyName("db0/Root");}
	VSqlMeta folderTables() { return meta_byKeyName("db0/Tables");}

	void clearMaps();
	VSqlItem item_byIdItem(const QVariant &idItem) { return m_itemMap.item_byIdItem(idItem);}

	VSqlNodeMap *nodeMap() { return &m_nodeMap;}
	VSqlItemMap *itemMap() { return &m_itemMap;}

	//VSqlMetaRecord *record_byKeyName(const QString &keyName);
	VSqlMeta meta_byKeyName(const QVariant &keyName,const QVariant &idNodeParent = QVariant());
	VSqlMeta meta_byKeyNameEx(const QVariant &keyName,const VSqlMeta &metaParent = VSqlMeta());
	
	QList<VSqlMeta> childMetaList_byKeyName(const QString &keyNameParent);
	QList<VSqlMeta> childMetaList_byIdNode(const QVariant &idNode);
	QList<VSqlMeta> childMetaList_byMeta(const VSqlMeta &meta) { return childMetaList_byIdNode(meta.node().idNode().value());}
	
	QList<VSqlMetaRecord*> recordPtrList_byIdNodeList(const QVariantList &idNodeList);
	VSqlMetaRecord *record_byIdNode(const QVariant &idNode);
	VSqlMeta meta_byIdNode(const QVariant &idNode) { return VSqlMeta(record_byIdNode(idNode));}
	QList<VSqlMetaRecord*> children_byIdNode(const QVariant &idNode);

	void insertChildren(const QVariant &idNodeParent,const QList<VSqlMeta*> &metaChildListPtr);
	void insertChild   (const QVariant &idNodeParent,VSqlMeta *metaChildPtr);
	void insertChildEx (VSqlMeta *metaChildPtr,const VSqlMeta &metaParent);

	bool updateValue(const QVariant &idNode,int column,const QVariant &value);
	
private:
	//QList<VSqlMetaRecord*> selectChildrenByIdNode(const QVariant &idNode);

	VSqlMetaColumnList m_columnList;

	VSqlNodeMap m_nodeMap;
	VSqlItemMap m_itemMap;

	QMap<quint64,VSqlMetaRecord*> m_idNodeRecordMap;
	//QMap<QString,VSqlMetaRecord*> m_keyNameUpperRecordMap;
};

///////////////////////////////////////////////////////////////////////////////

#endif
